#include "lcd_init.h"
#include "intrins.h"
u8 code0[]={0x0b,0x17,0x0a,0x0d,0x1a,0x19,0x16,0x1d,0x21,0x26,0x37,0x3c,0x00,0x09,0x05,0x10};
u8 code1[]={0x0c,0x19,0x09,0x0d,0x1b,0x19,0x15,0x1d,0x21,0x26,0x39,0x3E,0x00,0x09,0x05,0x10};
void Delay1ms()		//@24.000MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	i = 46;
	j = 113;
	do
	{
		while (--j);
	} while (--i);
}
//不准确延时函数
void delay_ms(unsigned char ms)
{                         
	while(ms)
	{
Delay1ms();
		ms--;
	}
}
void Delay1us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 9;
	while (--i);
}
void delay_us(unsigned char us)
{    
	while(us)
	{
Delay1us();
		us--;
	}
}
#if HARDSPI
void SpiInt()
{
  //  LCD_CS = 1;
    SPDAT=0;//数据寄存器清0
    SPCTL=0xDc;//1101 11xx 主模式,使能,先传数据最高位,前时钟为下降沿,并在下降沿驱动数据,上升沿检测数据
    SPSTAT = 0xc0;                              //清中断标志
//		P_SW1=0;
//    IE2 = ESPI;                                 //使能SPI中断
//    EA = 1;
//    LED=!LED;
}
/******************************************************************************
      函数说明：LCD串行数据写入函数
      入口数据：dat  要写入的串行数据
      返回值：  无
******************************************************************************/

void LCD_Writ_Bus(u8 dat) 
{	
//   LCD_CS = 0;                            //拉低从机SS管脚

    SPDAT = dat;                           //发送
    while (!(SPSTAT & 0x80));               //查询完成标志
    SPSTAT = 0xc0;                          //清中断标志
//    LCD_CS = 1; 
}
#else
/******************************************************************************
      函数说明：LCD串行数据写入函数
      入口数据：dat  要写入的串行数据
      返回值：  无
******************************************************************************/
void LCD_Writ_Bus(u8 dat) 
{	
	u8 i;
//	LCD_CS_Clr();
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_Clr();
		if(dat&0x80)
		{
		   LCD_MOSI_Set();
		}
		else
		{
		   LCD_MOSI_Clr();
		}
		LCD_SCLK_Set();
		dat<<=1;
	}	
//  LCD_CS_Set();	
}
#endif

/******************************************************************************
      函数说明：LCD写入数据
      入口数据：dat 写入的数据
      返回值：  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明：LCD写入数据
      入口数据：dat 写入的数据
      返回值：  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}


/******************************************************************************
      函数说明：LCD写入命令
      入口数据：dat 写入的命令
      返回值：  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
	LCD_DC_Clr();//写命令
	LCD_Writ_Bus(dat);
	LCD_DC_Set();//写数据
}


/******************************************************************************
      函数说明：设置起始和结束地址
      入口数据：x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值：  无
******************************************************************************/
void LCD_Address_Set(u8 x1,u8 y1,u8 x2,u8 y2)
{
#if 0
	if(USE_HORIZONTAL==0)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+24+fix_x);
		LCD_WR_DATA(x2+24+fix_x);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+fix_y);
		LCD_WR_DATA(y2+fix_y);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==1)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+24+fix_x);
		LCD_WR_DATA(x2+24+fix_x);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+fix_y);
		LCD_WR_DATA(y2+fix_y);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==2)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+fix_x);
		LCD_WR_DATA(x2+fix_x);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+24+fix_y);
		LCD_WR_DATA(y2+24+fix_y);
		LCD_WR_REG(0x2c);//储存器写
	}
	else
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+fix_x);
		LCD_WR_DATA(x2+fix_x);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+24+fix_y);
		LCD_WR_DATA(y2+24+fix_y);
		LCD_WR_REG(0x2c);//储存器写
	}
#else
	#if OLD_SCREEN
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+fix_x);
		LCD_WR_DATA(x2+fix_x);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+24+fix_y);
		LCD_WR_DATA(y2+24+fix_y);
		LCD_WR_REG(0x2c);//储存器写
	#else
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+24);
		LCD_WR_DATA(y2+24);
		LCD_WR_REG(0x2c);//储存器写	
	#endif
#endif	
}

void LCD_Init(void)
{
	u8 i;
	#if HARDSPI
	SpiInt();
	#endif
//	LCD_RES_Clr();//复位
//	LCD_RES_Set();
	
//	LCD_BLK_Set();//打开背光
  delay_ms(100);
	
	LCD_WR_REG(0x11);//Sleep exit 
	delay_ms(220);                //Delay 120ms 
	LCD_WR_REG(0xB1);     
	LCD_WR_DATA8(0x05);   
	LCD_WR_DATA8(0x3C);   
	LCD_WR_DATA8(0x3C);   

	LCD_WR_REG(0xB2);     
	LCD_WR_DATA8(0x05);   
	LCD_WR_DATA8(0x3C);   
	LCD_WR_DATA8(0x3C);   

	LCD_WR_REG(0xB3);     
	LCD_WR_DATA8(0x05);   
	LCD_WR_DATA8(0x3C);   
	LCD_WR_DATA8(0x3C);   
	LCD_WR_DATA8(0x05);   
	LCD_WR_DATA8(0x3C);   
	LCD_WR_DATA8(0x3C);   

	LCD_WR_REG(0xB4);     //Dot inversion
	LCD_WR_DATA8(0x03);   

	LCD_WR_REG(0xC0);     
	LCD_WR_DATA8(0x0E);   
	LCD_WR_DATA8(0x0E);   
	LCD_WR_DATA8(0x04);   

	LCD_WR_REG(0xC1);     
	LCD_WR_DATA8(0xC5);   

	LCD_WR_REG(0xC2);     
	LCD_WR_DATA8(0x0d);   
	LCD_WR_DATA8(0x00);   

	LCD_WR_REG(0xC3);     
	LCD_WR_DATA8(0x8D);   
	LCD_WR_DATA8(0x2A);   

	LCD_WR_REG(0xC4);     
	LCD_WR_DATA8(0x8D);   
	LCD_WR_DATA8(0xEE);   

	LCD_WR_REG(0xC5);     //VCOM
	LCD_WR_DATA8(0x06); //1D  .06


	LCD_WR_REG(0x36);     //MX, MY, RGB mode
//	if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
//	else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
//	else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x78);
//	else LCD_WR_DATA8(0xA8);  
LCD_WR_DATA8(0x78);

	LCD_WR_REG(0x3A); 
	LCD_WR_DATA8(0x55);
		
	LCD_WR_REG(0xE0);     
/*	LCD_WR_DATA8(0x0b);   
	LCD_WR_DATA8(0x17);   
	LCD_WR_DATA8(0x0a);   
	LCD_WR_DATA8(0x0d);   
	LCD_WR_DATA8(0x1a);   
	LCD_WR_DATA8(0x19);   
	LCD_WR_DATA8(0x16);   
	LCD_WR_DATA8(0x1d);   
	LCD_WR_DATA8(0x21);   
	LCD_WR_DATA8(0x26);   
	LCD_WR_DATA8(0x37);   
	LCD_WR_DATA8(0x3c);   
	LCD_WR_DATA8(0x00);   
	LCD_WR_DATA8(0x09);   
	LCD_WR_DATA8(0x05);   
	LCD_WR_DATA8(0x10);  */
for(i=0;i<16;i++)
{
		LCD_WR_DATA8(code0[i]);
}

	LCD_WR_REG(0xE1); 
for(i=0;i<16;i++)
{
		LCD_WR_DATA8(code1[i]);
}

	LCD_WR_REG(0x29);     //Display on
}








